#ifndef RDPCORE_H
#define RDPCORE_H

// rdpCore类
//   用于屏幕分块截图并压缩为数据流
//
// created by yiyefangzhou24
// 2022/12/24

#include <QObject>
#include <QByteArray>
#include <QList>

class rdpCore : public QObject
{
public:
    rdpCore(bool debug = false);

    /**
     * @brief 设置配置参数
     * @param x x轴分块数量
     * @param y y轴分块数量
     * @param width 服务端的显示宽度
     * @param height 服务端的现实高度
     * @param bit 显示位图的色阶（8、16、24、32）
     */
    void setConfig(int x, int y, int width, int height, int b);


    /**
     * @brief 进行一次全屏截图，并将变化的数据分块存放在位图快中
     */
    void takeScreenShot();


    /**
     * @brief 获取位于[x,y]处的图像块数据
     * @param x 图像块的x轴坐标
     * @param y 图像块的y轴坐标
     * @return 该函数会比较本次截图和上一次截图是否有不同，如果完全相同则返回空数据，否则返回该图像块的数据
     */
    QByteArray getBlockMapData(int x, int y);

public:

    // 是否开启调试模式，如果开启调试模式则保存图片到文件
    bool isDebug = false;

private:

    /**
     * @brief 私有函数 - 检测配置信息
     * @return 通过返回true，错误返回false
     */
    bool checkEnv();


//    /**
//     * @brief 私有函数 - 保存位图到文件
//     * @param pixmap 位图数据
//     * @param x [可选] 文件名中标注x轴序号
//     * @param y [可选] 文件名中标注y轴序号
//     */
//    void savePixmap(QPixmap pixmap, int x=0, int y=0);

    /**
     * @brief 私有函数 - 保存图片到文件
     * @param image 图片数据
     * @param x [可选] 文件名中标注x轴序号
     * @param y [可选] 文件名中标注y轴序号
     */
    void saveImage(QImage image, int x=0, int y=0);


    /**
     * @brief 私有函数 - 比较图片数据和pixmapDataArr中上一次图片数据是否相同
     * @param x x轴序号
     * @param y y轴序号
     * @param pixmapData 需要比较的源数据
     * @return 相同返回true，不同返回false
     */
    bool cmpBlockMap(int x, int y, QByteArray pixmapData);

private:

    int indexX;         //x轴分块数量

    int indexY;         //y轴分块数量

    int clientWidth;    //客户端屏幕宽度

    int clientHeight;   //客户端屏幕高度

    int clientBlockWidth;   //客户端图像分块宽度

    int clientBlockHeight;  //客户端图像分块高度

    int serverWidth;    //服务端显示宽度

    int serverHeight;   //服务端显示高度

    int serverBlockWidth;   //服务端图像分块宽度

    int serverBlockHeight;  //服务端图像分块高度

    int bit;                //图片色阶

    QList<QByteArray> pixmapDataArr;    //存放各个图片块的数据
};

#endif // RDPCORE_H
